package com.yuw.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.UUID;

public class MyUtils {

    /**
     * 公用的文件上传方法
     *
     * @param multipartFile       request中的文件流对象
     * @param strUploadfiles      服务器保存上传文件的目录名
     * @param strFileNamePrefix   服务器上传文件新命名的前缀【新前缀+UUID+文件类型后缀】
     * @param objBean             实体类参数【保存上传文件的相对路径】
     * @param beanFilePropetyName 实体类的属性名【保存上传文件相对路径的属性名】
     */
    public static void doSingleFileUpload(MultipartFile multipartFile, String strUploadfiles, String strFileNamePrefix, Object objBean, String beanFilePropetyName) {


        // 上传文件的位置
        // 通过System工具类获取当前服务器发布的地址
        // 获取的是项目在服务器发布的根目录地址
        /*
        使用 System.getProperty("server.basePath");
        获取服务器的绝对路径地址，需要在web.xml中配置 org.springframework.web.util.WebAppRootListener 监听器
         */
        // 服务器上的项目的根目录地址
        String strBasePath = "";
        // ssm的获取方式
//        String strBasePath = System.getProperty("server.basePath");
//        System.out.println("服务器根据路地址：" + strBasePath);

        // springboot的获取方式
        try {
            strBasePath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
            // 此处剔除了 target/classes/  但是注意 访问路径的确定

            //                if(serverBasePath != null && serverBasePath != ""){
            //                    serverBasePath = serverBasePath.replace("target"+File.separator+"classes"+File.separator,"");
            //                    serverBasePath = serverBasePath.replace("target\\classes\\","");
            //                    serverBasePath = serverBasePath.replace("target/classes/","");
            //                }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 定义上传文件的目录名
        //String strUploadfiles = "uploadfiles";
        // 把上传的文件的目录放在静态资源解析的文件夹中
        String strfullDirectoryPath = strBasePath + File.separator + "static" + File.separator
                + strUploadfiles + File.separator;
        //判断上传文件的存放目录是否存在，如果不存在，则创建这个目录，然后在上传文件
        File uploadDirectory = new File(strfullDirectoryPath);
        if (!uploadDirectory.exists()) {
            // 创建目录
            uploadDirectory.mkdirs();
        }

        // 上传文件的命名规则
        // 给上传文件进行重新命名
        // 获取原文件名，并通过原文件名 sssxxx.jpg 获取文件的后缀
        String strOriginalFilename = multipartFile.getOriginalFilename();
        // 获取上传源文件的后缀
        String strFileSufix = StringUtils.substringAfterLast(strOriginalFilename, ".");
        // UUID生成新的文件名（防止重复）
        // String strFileNewName = "userimg" + UUID.randomUUID().toString() + "." + strFileSufix;
        String strFileNewName = strFileNamePrefix + UUID.randomUUID().toString() + "." + strFileSufix;
        // 创建新上传的文件对象
        String uploadNewFileName = strfullDirectoryPath + File.separator + strFileNewName;
        // 新上传的文件
        File uploadNewFile = new File(uploadNewFileName);

        try {
            // 创建上传的文件
            multipartFile.transferTo(uploadNewFile);
            // 这里使用了反射，但是是借助于apache的commons的BeanUtils工具进行实体类的反射处理
            // 文件上传成功以后，将新上传的文件的服务器的相对路径保存到参数实体类的指定的属性字段上
            // springboot下不需要添加static路径
//            BeanUtils.setProperty(objBean, beanFilePropetyName, "static" + File.separator
//                    + strUploadfiles + File.separator + strFileNewName);

            BeanUtils.setProperty(objBean, beanFilePropetyName,  strUploadfiles + File.separator + strFileNewName);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("文件上传失败：" + e.getMessage());
        }

    }

}
